/* CloudTrail Viewer, is a Java desktop application for reading AWS CloudTrail logs files. Copyright (C) 2017 Mark P. Haskins This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package io.haskins.java.cloudtrailviewer.controller.widget; import de.jensd.fx.glyphs.fontawesome.FontAwesomeIcon; import de.jensd.fx.glyphs.fontawesome.FontAwesomeIconView; import io.haskins.java.cloudtrailviewer.model.DashboardWidget; import io.haskins.java.cloudtrailviewer.model.event.Event; import io.haskins.java.cloudtrailviewer.service.DatabaseService; import io.haskins.java.cloudtrailviewer.service.EventTableService; import io.haskins.java.cloudtrailviewer.utils.EventUtils; import javafx.collections.FXCollections; import javafx.fxml.FXMLLoader; import javafx.scene.Node; import javafx.scene.chart.XYChart; import javafx.scene.control.Tooltip; import javafx.scene.input.MouseEvent; import javafx.scene.layout.BorderPane; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * * Controller that provides a Stacked Bar Chart widget * * Created by markhaskins on 10/01/2017. */ public class ChartBarStackedWidgetController extends XYChartController { // @FXML private StackedBarChart chart; public BorderPane loadFXML() { FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/widget/ChartBarStackedWidget.fxml")); loader.setController(this); try { fxmlObject = loader.load(); } catch (IOException e) { e.printStackTrace(); } return fxmlObject; } FontAwesomeIconView getWidgetIcon() { return new FontAwesomeIconView(FontAwesomeIcon.BAR_CHART_ALT); } @Override public void configure(DashboardWidget widget, EventTableService eventTableService, DatabaseService databaseService) { super.configure(widget, eventTableService, databaseService); chart.setPrefWidth(widget.getWidth()); chart.setPrefHeight(widget.getHeight()); chart.getXAxis().setTickLabelsVisible(false); } public void newEvents(List<Event> events) { for (Event event : events) { newEvent(event); } } @Override public void newEvent(Event event) { String c = EventUtils.getEventProperty(this.widget.getCategoryField(), event); if (!categories.contains(c)) { categories.add(c); } String s = EventUtils.getEventProperty(this.widget.getSeriesField(), event); Map<String, List<Event>> catMap; if (multiSeries.containsKey(s)) { catMap = multiSeries.get(s); } else { catMap = new HashMap<>(); multiSeries.put(s, catMap); } List<Event> evList; if (catMap.containsKey(c)) { evList = catMap.get(c); } else { evList = new ArrayList<>(); catMap.put(c, evList); } evList.add(event); } public void loadingFile(int fileName, int totalFiles) { } public void finishedLoading(boolean reload) { if (reload) { chart.getData().clear(); } xAxis.setLabel(widget.getSeriesField()); xAxis.setCategories(FXCollections.observableArrayList(categories)); yAxis.setLabel("Count"); for (Map.Entry<String, Map<String, List<Event>>> entry : multiSeries.entrySet()) { String seriesName = entry.getKey(); XYChart.Series<String, Number> series = new XYChart.Series<>(); series.setName(seriesName); Map<String, List<Event>> catData = entry.getValue(); for (Map.Entry<String, List<Event>> data : catData.entrySet()) { String catName = data.getKey(); List<Event> events = data.getValue(); series.getData().add(new XYChart.Data<>(catName, events.size())); } chart.getData().add(series); } for (XYChart.Series<String,Number> series: chart.getData()){ for (XYChart.Data<String, Number> item: series.getData()){ String seriesName = series.getName(); Map<String, List<Event>> catData = multiSeries.get(seriesName); for (Map.Entry<String, List<Event>> catData2 : catData.entrySet()) { List<Event> events = catData2.getValue(); item.getNode().setOnMousePressed((MouseEvent event) -> eventTableService.setTableEvents(events)); Node node = item.getNode(); Tooltip t = new Tooltip(seriesName + " : " + item.getYValue()); Tooltip.install(node, t); } } } } }